<?php

namespace Inscripcion\Controller\Service;

use Inscripcion\Controller\Service\GenericService;
use Inscripcion\Model\Entity\ControlInscripcion;
use Zend\Db\Adapter\Adapter;
use Componentes\Controller\VariablesGlobales;
use Componentes\Controller\UtilsArrayController;
use Inscripcion\Model\Dao\ControlInscripcionDAO;
use Componentes\Controller\Mensajes;
use Maestros\Controller\Service\PersonaService;
use Maestros\Controller\Service\EstadoAlumnoService;
use DateTime;
use DateTimeZone;

class ControlInscripcionService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $controlInscripcionService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    /**
     * 
     * @param type $adapter
     * @return Instancia de ControlInscripcionService
     * Patron singleton
     */
    public static function getInstance($adapter) {
        if (self::$controlInscripcionService == null) {
            self::$controlInscripcionService = new ControlInscripcionService($adapter);
        }
        return self::$controlInscripcionService;
    }

    public function getControlInscripcionDao() {
        return ControlInscripcionDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $controlInscripcion = $this->obtenerControlInscripcionSegunId($id);
        if ($controlInscripcion->getId() != null) {
            $data[0] = $controlInscripcion->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getRegistroCompleto($id) {
        $data = null;
        $success = false;
        $controlInscripcion = $this->obtenerControlInscripcionSegunId($id);
        if ($controlInscripcion->getId() != null) {
            $data[0] = $controlInscripcion->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getControlInscripcion($id) {
        $data = null;
        $success = false;
        $controlInscripcion = $this->obtenerControlInscripcionSegunId($id);
        if ($controlInscripcion->getId() != null) {
            $data[0] = $controlInscripcion->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

//------Retornan los objetos-------

    public function obtenerControlInscripcionSegunId($id) {
        $registros = $this->getControlInscripcionDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $controlInscripcion = new ControlInscripcion($data[0]);
        $controlInscripcion->setHoraInicio($data[0]['hora_inicio']);
        $controlInscripcion->setHoraFin($data[0]['hora_fin']);
        $controlInscripcion->setCodigoSeguridad($data[0]['codigo_seguridad']);
        $controlInscripcion->setCreditosMaximo($data[0]['creditos_maximo']);
        $controlInscripcion->setLapsoInscripcion($data[0]['id_lapso_inscripcion']);
        $controlInscripcion->setTrayectoSemestre($data[0]['id_trayecto_semestre']);
        return $controlInscripcion;
    }

    public function validarAcceso($cedula) {
        $data = null;
        $success = false;
        $mensaje = null;
        $servicioPersona = PersonaService::getInstance($this->dbAdapter);
        $persona = $servicioPersona->obtenerPersonaSegunCedula($cedula);
        if ($persona->getId() != null) {
            $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
            $controlInscripcion = $this->obtenerInscripcionSegunCedulaAlumnoYLapsoInscripcion($persona->getCedula(), $lapsoInscripcion);
            if ($controlInscripcion->getId() != null) {
                if ($controlInscripcion->getPuesto() > 0) {
                    $servicioMetodologia = MetodologiaInscripcionService::getInstance($this->dbAdapter);
                    $arrayMetodologia = $servicioMetodologia->obtenerArrayMetodologiaInscripcionSegunId($controlInscripcion->getMetodologia());
                    $horaInicio = DateTime::createFromFormat('Y-m-d H:i:s', $controlInscripcion->getHoraInicio());
                    $horaFin = DateTime::createFromFormat('Y-m-d H:i:s', $controlInscripcion->getHoraFin());
                    $horaNow = new DateTime("now", new DateTimeZone('America/Caracas'));
                    if (($horaInicio < $horaNow) && ($horaNow < $horaFin)) {
                        if ($controlInscripcion->getMetodologia() == 1) {
                            $success = false;
                            $data = $arrayMetodologia;
                            $mensaje = Mensajes::msjMetodologiaInscripcion($data[0]['nombre']) . Mensajes::msjSaltoLinea() . " Y  " . Mensajes::msjIntervaloDeFecha($horaInicio, $horaFin);
                        } else {
                            $success = true;
                            $mensaje = 'ENTRADA AL SISTEMA EXITOSA';
                            $data = $controlInscripcion->objectToArray();
//                        unset($data['bauche']);
//                        unset($data['codigoSeguridad']);
                            $data['_metodologia'] = $arrayMetodologia;
                        }
                    } else {
                        $success = false;
                        $data = $arrayMetodologia;
                        if ($controlInscripcion->getMetodologia() == 1) {
                            $mensaje = Mensajes::msjMetodologiaInscripcion($data[0]['nombre']) . Mensajes::msjSaltoLinea() . " Y  " . Mensajes::msjIntervaloDeFecha($horaInicio, $horaFin);
                        } else {
                            $mensaje = Mensajes::msjIntervaloDeFecha($horaInicio, $horaFin) . Mensajes::msjSaltoLinea() . Mensajes::msjMetodologiaInscripcion($data[0]['nombre']);
                        }
                    }
                } else {
                    $mensaje = Mensajes::msjYaInscritos();
                }
            } else {
                $mensaje = Mensajes::msjSinControlInscripcion();
            }
//            } else {
//                $mensaje = Mensajes::msjAccesoDenegadoPorSuspencionORetiro();
//            }
        } else {
            $mensaje = Mensajes::msjSinRegistroEnLaTablaAlumno();
        }
        $output = UtilsArrayController::organizarOutput($success, $data, $mensaje);
        return $output;
    }

    public function getControlInscripcionSegunCedula($cedula) {
        $data = null;
        $success = false;
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $controlInscripcion = $this->obtenerInscripcionSegunCedulaAlumnoYLapsoInscripcion($cedula, $lapsoInscripcion);
        if ($controlInscripcion->getId() != null) {
            $data[0] = $controlInscripcion->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

    public function obtenerInscripcionSegunCedulaAlumnoYLapsoInscripcion($cedulaAlumno, $lapsoInscripcion) {
        $result = $this->getControlInscripcionDao()->getControlInscripcionsSegunCedulaYLapso($cedulaAlumno, $lapsoInscripcion);
        $data = UtilsArrayController::llenarData($result);
        $servicioEstadoAlumno= EstadoAlumnoService::getInstance($this->dbAdapter);
        $estadoAlumno = $servicioEstadoAlumno->obtenerEstadoAlumnoSegunId($data[0]['id_estado_alumno']) ;
        $controlInscripcion = new ControlInscripcion($data[0]);
        $controlInscripcion->setHoraInicio($data[0]['hora_inicio']);
        $controlInscripcion->setHoraFin($data[0]['hora_fin']);
        $controlInscripcion->setCodigoSeguridad($data[0]['codigo_seguridad']);
        $controlInscripcion->setCreditosMaximo($data[0]['creditos_maximo']);
        $controlInscripcion->setLapsoInscripcion($data[0]['id_lapso_inscripcion']);
        $controlInscripcion->setTrayectoSemestre($data[0]['id_trayecto_semestre']);
        $controlInscripcion->setEstadoAlumno($estadoAlumno->getNombre());
        return $controlInscripcion;
    }

//---------------------------------

    public function actualizarCodigoDeSeguridad($cedulaAlumno, $codigoSeguridad, $fecha) {
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $controlInscripcion = $this->obtenerInscripcionSegunCedulaAlumnoYLapsoInscripcion($cedulaAlumno, $lapsoInscripcion);
        $result = $this->getControlInscripcionDao()->updateCodigoSeguridad($controlInscripcion->getId(), $codigoSeguridad, $fecha);
        return $result;
    }
//-------------------------
    
   

}
